Fric-frac CountryController
De CountryController klasse dispatcht alle request die verband houden met het beheer van de Country entiteit. Dat komt neer op het afhandelen van alle use cases die we hebben opgesteld voor het beheren van de entiteit Country, o.a.:
- I
ndex ReadingOneInsertingOneUpdatingOneDeleteOneInsertOneUpdateOne
De CountryController klasse
- Maak een nieuwe
Controllerklasse in de Controllers map. Hoe je dat doen hebben we geleerd in Fric-frac AdminController. - Kies ervoor om een MVC Controller Class te maken en geef er de naam CountryController.cs aan.
- Injecteer de DBContext in de constructor:
namespace FricFrac.Controllers { public class CountryController : Controller { private readonly Docent300Context dbContext; // voeg constructor toe om geïnjecteerde DBContext // te kunnen binnenkrijgen in deze klasse public CountryController(Docent300Context dbContext) { this.dbContext = dbContext; } - We beginnen met methoden die de bedoeling hebben een input view aan de gebruiker te tonen. We wijzigen of voegen daarvoor de volgende methoden toe:
- De
IndexmethodeDe Index methode handelt de Country/Index use case af. We raadplegen Fric-frac Use Case Person Index om nog eens na te gaan wat die methode precies moet doen. Aan de view geven we de lijst van de landen mee:
// GET: /<controller>/ public IActionResult Index() { ViewBag.Title = "Fric-frac Country Index"; return View(dbContext.Country.ToList()); } - De
InsertingOnemethode toevoegenOm naar de
InsertingOneview te kunnen navigeren moeten we de use case/Country/InsertingOnedie staat op de Index.cshtml pagina implementeren. Daarvoor moeten we een methode maken in deCountryControllerklasse die het klikken op de link inIndex.cshtmlafhandelt. De naam van de methode moet de afspraken, die gelden binnen het MVC framework, moet dusInsertingOnezijn. Dat is dezelfde naam als het twee deel van de URL. Het eerste deel van de URL verwijst naar de naam van de controller. We geven de lijst van de landen aan de view mee:public IActionResult InsertingOne() { ViewBag.Title = "Fric-frac Country Inserting One"; return View(dbContext.Country.ToList()); } - De
ReadingOneactiemethode toevoegenOm naar de
ReadingOnepagina te kunnen navigeren moeten we de use case/Country/ReadingOne,die staat op de op alle pagina's waarop een lijst met landen staat waaruit een land geselecteerd kan worden, implementeren. Daarvoor moeten we een methode maken in deCountryControllerklasse die het klikken op de select link<a href = "/Country/ReadingOne_XX">afhandelt. De XX staat voor de Id van de rij. De naam van de methode, geheel volgens de afspraken binnen het MVC framework, is dus ReadingOne. Dat is dezelfde naam als het twee deel van de URL. Het eerste deel van de URL verwijst naar de naam van de controller. Deze naam is de naam van de actiemethode in deCountryControllerklasse en de naam van de view die door deze methode geretourneerd wordt. Met behulp van Linq halen we de gewenste rij op en geven het object door aan de view:[HttpGet] public IActionResult ReadingOne(int? id) { ViewBag.Message = "Insert een land in de database"; if (id == null) { return NotFound(); } var country = dbContext.Country.SingleOrDefault(m => m.Id == id); if (country == null) { return NotFound(); } return View(country); } - De UpdatingOne actiemethode toevoegen
Om naar de Updating pagina te kunnen navigeren moeten we de use case
/Country/UpdatingOne/XX,die staat op deReadingOnepagina staat, implementeren. Daarvoor moeten we een methode maken in deCountryControllerklasse die het klikken op de select link<a href = "/Country/UpdatingOne/XX">afhandelt. De XX staat voor de Id van de rij. De naam van de methode, geheel volgens de afspraken binnen het MVC framework, is dus UpdatingOne. Dat is dezelfde naam als het twee deel van de URL. Het eerste deel van de URL verwijst naar de naam van de controller. Deze naam is de naam van de actiemethode in deCountryControllerklasse en de naam van de view die door deze methode geretourneerd wordt. De link, die deze use case in gang zet, De html code daarvoor ziet er zo uit:<a href="/Country/UpdatingOne/@Model.Id" class="tile"> <span class="icon-pencil"></span> <span class="screen-reader-text">Updating One</span> </a>We implementeren nu de actiemethode
UpdatingOnein deCountryControllerklasse. De methode krijgt als argument deIdvan de te zoeken rij mee.[HttpGet] public IActionResult UpdatingOne(int? id) { ViewBag.Title = "Fric-frac Country Updating One"; if (id == null) { return NotFound(); } var country = dbContext.Country.SingleOrDefault(m => m.Id == id); if (country == null) { return NotFound(); } return View(country); } - De Cancel methode toevoegen
Met de Cancel knop keert de gebruiker terug naar de Index view:
public IActionResult Cancel() { return RedirectToAction("Index"); }
- De
- De CRUD methoden
- InsertOne
Om een rij aan de tabel te kunnen toevoegen moeten we eerst het
Countrymodel binden aan de input van de gebruiker. In hetCountrymodel hebben we aangeven met welk name attribuut een property overeenkomt:[FromForm(Name = "Country-Name")]
ASP.NET MVC is daardoor in staat automatisch de inputvelden van de form te binden aan het model:
[HttpPost] public IActionResult InsertOne(Models.FricFrac.Country Country) { ViewBag.Message = "Insert een land in de database"; dbContext.Country.Add(Country); dbContext.SaveChanges(); return View("Index", dbContext.Country); } - UpdateOne
[HttpPost] public IActionResult UpdateOne(Models.FricFrac.Country country) { if (ModelState.IsValid) { try { dbContext.Update(country); dbContext.SaveChanges(); return View("ReadingOne", country); } catch (DbUpdateConcurrencyException) { if (!dbContext.Country.Any(e => e.Id == country.Id)) { return NotFound(); } else { throw; } } } return View("Index", country); } - DeleteOne
// GET: Supplier/Delete/5 public IActionResult DeleteOne(int? id) { if (id == null) { return NotFound(); } // zoek het land dat verwijderd moet worden var country = dbContext.Country.SingleOrDefault(m => m.Id == id); if (country == null) { return NotFound(); } dbContext.Country.Remove(country); dbContext.SaveChanges(); // keer terug naar de index pagina return RedirectToAction("Index"); }
- InsertOne